package siruna.WE.core.XML;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.HashMap;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.FactoryConfigurationError;
import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

/**
 * Klasse die een lokaal xml bestand kan inlezen en verwerken gebruikt om de
 * preferences van een widget in te lezen
 * 
 * @author Tim
 * 
 */
public class XmlReader {

	// het lokale bestand
	private File f;

	/**
	 * Construtor
	 * 
	 * @param f
	 *            het xml-bestand
	 */
	public XmlReader(File f) {
		this.f = f;
	}

	/**
	 * Lege construtor
	 */
	public XmlReader() {
	}

	/**
	 * parsed het gegeven bestand en geeft een hashmap terug van alle naam
	 * waarde paren in het preferences bestand
	 * 
	 * @return hashmap met de naam waarde paren
	 */
	public HashMap<String, String> read() {
		HashMap<String, String> hash = new HashMap<String, String>();
		try {
			FileInputStream fIn = new FileInputStream(f);
			Document doc = parseFile(fIn);
			NodeList vis = doc.getElementsByTagName("preference");
			for (int i = 0; i < vis.getLength(); i++) {
				// Get element
				if (vis.item(i).getNodeType() == Document.ELEMENT_NODE) {

					String Name = ((Element) vis.item(i)).getAttribute("name");
					// String Type = ((Element)
					// vis.item(i)).getAttribute("type");
					String Default = ((Element) vis.item(i))
							.getAttribute("defaultValue");

					hash.put(Name, Default);
					// System.out.println(Name + "   " + Default);
				}
			}
			fIn.close();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (FactoryConfigurationError e) {
			e.printStackTrace();
		} catch (ParserConfigurationException e) {
			e.printStackTrace();
		} catch (SAXException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return hash;
	}

	/**
	 * 
	 * Methode die een fileinputstream omzat naar een xml Document
	 * 
	 * @param in
	 *            inputstream dat een xml-bestand voorstelt
	 * @return Document (xml)
	 */
	public Document parseFile(FileInputStream in)
			throws FactoryConfigurationError, ParserConfigurationException,
			SAXException, IOException {

		BufferedInputStream bis = new BufferedInputStream(in);

		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		DocumentBuilder builder = factory.newDocumentBuilder();
		Document doc = builder.parse(bis);

		return doc;
	}
	/**
	 * Hulpmethode om de hashmap eens uit te schrijven
	 */
	// private void schrijf(NodeList list) {
	// System.out.println("XML Elements: ");
	// for (int i = 0; i < list.getLength(); i++) {
	// // Get element
	// if (list.item(i).getNodeType() == Document.ELEMENT_NODE) {
	//
	// Element element = (Element) list.item(i);
	// System.out.println(element.getNodeName());
	//
	// }
	// }
	// }
}
